package cn.toma.manager.sys;

import cn.toma.common.utils.TreeUtil;
import cn.toma.common.vo.router.RouterMeta;
import cn.toma.common.vo.router.VueRouter;
import cn.toma.model.sys.Menu;
import cn.toma.model.sys.Role;
import cn.toma.model.sys.User;
import cn.toma.service.sys.MenuService;
import cn.toma.service.sys.RoleService;
import cn.toma.service.sys.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 封装一些和 User相关的业务操作
 */
@Service
public class UserManager
{

	@Autowired
	private RoleService roleService;
	@Autowired
	private MenuService menuService;
	@Autowired
	private UserService userService;


	/**
	 * 通过用户名获取用户基本信息
	 *
	 * @param username 用户名
	 * @return 用户基本信息
	 */
	public User getUser(String username)
	{
		return this.userService.findByName(username);
	}

	/**
	 * 通过用户名获取用户角色集合
	 *
	 * @param username 用户名
	 * @return 角色集合
	 */
	public Set<String> getUserRoles(String username)
	{
		List<Role> roleList =  this.roleService.findUserRole(username);
		return roleList.stream().map(Role::getRoleName).collect(Collectors.toSet());
	}

	/**
	 * 通过用户名获取用户权限集合
	 *
	 * @param username 用户名
	 * @return 权限集合
	 */
	public Set<String> getUserPermissions(String username)
	{
		List<Menu> permissionList =  this.menuService.findUserPermissions(username);
		return permissionList.stream().map(Menu::getPerms).collect(Collectors.toSet());
	}

	/**
	 * 通过用户名构建 Vue路由
	 *
	 * @param username 用户名
	 * @return 路由集合
	 */
	public List<VueRouter<Menu>> getUserRouters(String username)
	{
		List<VueRouter<Menu>> routes = new ArrayList<>();
		List<Menu> menus = this.menuService.findUserMenus(username);
		menus.forEach(menu ->
		{
			VueRouter<Menu> route = new VueRouter<>();
			route.setId(menu.getMenuId().toString());
			route.setParentId(menu.getParentId().toString());
			route.setIcon(menu.getIcon());
			route.setPath(menu.getPath());
			route.setComponent(menu.getComponent());
			route.setName(menu.getMenuName());
			route.setMeta(new RouterMeta(menu.getMenuName(), menu.getIcon(), true));
			routes.add(route);
		});
		return TreeUtil.buildVueRouter(routes);
	}





}
